package util

import (
	"crypto/md5"
	"crypto/sha1"
	"encoding/hex"
	"hash"
	"io"
	"os"
	"path/filepath"
)

// Sha1Stream 结构体用于计算SHA-1散列值。
type Sha1Stream struct {
	_sha1 hash.Hash
}

// Update 更新散列的计算，接受一个字节切片。
func (obj *Sha1Stream) Update(data []byte) {
	if obj._sha1 == nil {
		obj._sha1 = sha1.New()
	}
	obj._sha1.Write(data)
}

// Sum 返回计算得到的SHA-1散列值的十六进制字符串。
func (obj *Sha1Stream) Sum() string {
	return hex.EncodeToString(obj._sha1.Sum(nil))
}

// Sha1 接受一个字节切片并返回其SHA-1散列值的十六进制字符串。
func Sha1(data []byte) string {
	_sha1 := sha1.New()
	_sha1.Write(data)
	return hex.EncodeToString(_sha1.Sum(nil))
}
func FileSha1(file *os.File) string {
	_sha1 := sha1.New()
	io.Copy(_sha1, file)
	return hex.EncodeToString(_sha1.Sum(nil))
}

// FileSha1 计算文件的SHA1值
func FileSha12(file io.Reader) string {
	_sha1 := sha1.New()
	io.Copy(_sha1, file)
	return hex.EncodeToString(_sha1.Sum(nil))
}

// MD5 接受一个字节切片并返回其MD5散列值的十六进制字符串。
func MD5(data []byte) string {
	_md5 := md5.New()
	_md5.Write(data) // 修正了原代码中的 _md5.(data)
	return hex.EncodeToString(_md5.Sum(nil))
}

// FileMD5 接受一个 *os.File 参数并返回文件的 MD5 散列值的十六进制字符串。
func FileMD5(file *os.File) (string, error) {
	_md5 := md5.New()
	if _, err := io.Copy(_md5, file); err != nil {
		return "", err
	}
	return hex.EncodeToString(_md5.Sum(nil)), nil
}
func GetFileSize(directory string) (int64, error) {
	var result int64

	err := filepath.Walk(directory, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			return err
		}

		if !info.IsDir() {
			result = info.Size()
			return filepath.SkipDir // 停止遍历子目录
		}

		return nil
	})

	if err != nil {
		return 0, err
	}

	return result, nil
}

func PathExists(path string) (bool, error) {
	_, err := os.Stat(path)
	if err == nil {
		return true, nil
	}
	if os.IsNotExist(err) {
		return false, nil
	}
	return false, err
}
